
Anh Tuan
Data Science Expert

Tự động hóa web đã trở thành yếu tố thiết yếu cho thu thập dữ liệu, kiểm thử và nhiều hoạt động kinh doanh. Tuy nhiên, các trang web hiện đại triển khai các biện pháp chống bot tinh vi và CAPTCHA có thể làm dừng các script tự động hóa được lập trình cẩn thận nhất.
Kết hợp giữa DrissionPage và CapSolver cung cấp giải pháp mạnh mẽ cho thách thức này:
Kết hợp hai công cụ này cho phép tự động hóa web mượt mà, vượt qua cả phát hiện WebDriver và thách thức CAPTCHA.
Hướng dẫn này sẽ giúp bạn đạt được ba mục tiêu cốt lõi:
DrissionPage là công cụ tự động hóa web dựa trên Python, kết hợp khả năng kiểm soát trình duyệt với yêu cầu HTTP. Khác với Selenium, nó sử dụng nhân tự phát triển mà không phụ thuộc vào WebDriver, khiến việc phát hiện khó hơn.
# Cài đặt DrissionPage
pip install DrissionPage
# Cài đặt thư viện requests cho API CapSolver
pip install requests
from DrissionPage import ChromiumPage
# Tạo phiên bản trình duyệt
page = ChromiumPage()
# Điều hướng đến URL
page.get('https://wikipedia.org')
# Tìm và tương tác với các phần tử
page('#search-input').input('Xin chào thế giới')
page('#submit-btn').click()
CapSolver là dịch vụ giải quyết CAPTCHA tự động dựa trên AI, hỗ trợ nhiều loại CAPTCHA. Nó cung cấp API đơn giản cho phép bạn gửi thách thức CAPTCHA và nhận giải pháp trong vài giây.
https://api.capsolver.comhttps://api-stable.capsolver.comTrước khi kết hợp DrissionPage với CapSolver, tự động hóa web gặp phải một số vấn đề:
| Thách thức | Tác động |
|---|---|
| Phát hiện WebDriver | Script Selenium bị chặn ngay lập tức |
| Thách thức CAPTCHA | Yêu cầu giải quyết thủ công, phá vỡ tự động hóa |
| Độ phức tạp iframe | Khó tương tác với nội dung lồng nhau |
| Thao tác đa tab | Yêu cầu logic chuyển đổi tab phức tạp |
Tích hợp DrissionPage + CapSolver giải quyết tất cả các thách thức này trong một quy trình.
Phương pháp tích hợp API mang lại kiểm soát toàn diện quá trình giải quyết CAPTCHA và hoạt động với mọi loại CAPTCHA.
pip install DrissionPage requests
import time
import requests
from DrissionPage import ChromiumPage
CAPSOLVER_API_KEY = "KHÓA_API_CỦA_BẠN"
CAPSOLVER_API = "https://api.capsolver.com"
def create_task(task_payload: dict) -> str:
"""Tạo nhiệm vụ giải quyết CAPTCHA và trả về ID nhiệm vụ."""
response = requests.post(
f"{CAPSOLVER_API}/createTask",
json={
"clientKey": CAPSOLVER_API_KEY,
"task": task_payload
}
)
result = response.json()
if result.get("errorId") != 0:
raise Exception(f"Lỗi CapSolver: {result.get('errorDescription')}")
return result["taskId"]
def get_task_result(task_id: str, max_attempts: int = 120) -> dict:
"""Lắng nghe kết quả nhiệm vụ cho đến khi giải quyết hoặc hết thời gian."""
for _ in range(max_attempts):
response = requests.post(
f"{CAPSOLVER_API}/getTaskResult",
json={
"clientKey": CAPSOLVER_API_KEY,
"taskId": task_id
}
)
result = response.json()
if result.get("status") == "ready":
return result["solution"]
elif result.get("status") == "failed":
raise Exception(f"Nhật ký thất bại: {result.get('errorDescription')}")
time.sleep(1)
raise TimeoutError("Giải quyết CAPTCHA hết thời gian")
def solve_captcha(task_payload: dict) -> dict:
"""Hoàn tất quy trình giải quyết CAPTCHA."""
task_id = create_task(task_payload)
return get_task_result(task_id)
Bạn cũng có thể sử dụng tiện ích mở rộng CapSolver với DrissionPage để tiếp cận một cách ít can thiệp hơn.
config.js của tiện ích:// Trong thư mục tiện ích, chỉnh sửa: assets/config.js
var defined = {
apiKey: "KHÓA_API_CAPSOLVER_CỦA_BẠN", // Thay bằng khóa API thực tế của bạn
enabledForBlacklistControl: false,
blackUrlList: [],
enabledForRecaptcha: true,
enabledForRecaptchaV3: true,
enabledForTurnstile: true,
// ... các cài đặt khác
}
from DrissionPage import ChromiumPage, ChromiumOptions
co = ChromiumOptions()
co.add_extension('/đường_dẫn/tới/tiện_ích-capsolver')
page = ChromiumPage(co)
# Tiện ích sẽ tự động phát hiện và giải quyết CAPTCHA
Lưu ý: Tiện ích phải có khóa API hợp lệ được cấu hình trước khi có thể giải quyết CAPTCHA tự động.
Cloudflare Turnstile là một trong những thách thức CAPTCHA phổ biến nhất. Dưới đây là cách giải quyết nó:
import time
import requests
from DrissionPage import ChromiumPage
CAPSOLVER_API_KEY = "KHÓA_API_CỦA_BẠN"
CAPSOLVER_API = "https://api.capsolver.com"
def solve_turnstile(site_key: str, page_url: str) -> str:
"""Giải quyết Cloudflare Turnstile và trả về token."""
# Tạo nhiệm vụ
response = requests.post(
f"{CAPSOLVER_API}/createTask",
json={
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "AntiTurnstileTaskProxyLess",
"websiteURL": page_url,
"websiteKey": site_key,
}
}
)
result = response.json()
if result.get("errorId") != 0:
raise Exception(f"Lỗi: {result.get('errorDescription')}")
task_id = result["taskId"]
# Lắng nghe kết quả
while True:
result = requests.post(
f"{CAPSOLVER_API}/getTaskResult",
json={
"clientKey": CAPSOLVER_API_KEY,
"taskId": task_id
}
).json()
if result.get("status") == "ready":
return result["solution"]["token"]
elif result.get("status") == "failed":
raise Exception(f"Thất bại: {result.get('errorDescription')}")
time.sleep(1)
def main():
target_url = "https://trang-mục-tiêu-của-bạn.com"
turnstile_site_key = "0x4XXXXXXXXXXXXXXXXX" # Tìm trong mã nguồn trang
# Tạo phiên bản trình duyệt
page = ChromiumPage()
page.get(target_url)
# Chờ Turnstile tải
page.wait.ele_displayed('input[name="cf-turnstile-response"]', timeout=10)
# Giải quyết CAPTCHA
token = solve_turnstile(turnstile_site_key, target_url)
print(f"Nhận được token Turnstile: {token[:50]}...")
# Chèn token bằng JavaScript
page.run_js(f'''
document.querySelector('input[name="cf-turnstile-response"]').value = "{token}";
// Cũng kích hoạt callback nếu có
const callback = document.querySelector('[data-callback]');
if (callback) {{
const callbackName = callback.getAttribute('data-callback');
if (window[callbackName]) {{
window[callbackName]('{token}');
}}
}}
''')
# Gửi biểu mẫu
page('button[type="submit"]').click()
page.wait.load_start()
print("Đã vượt qua Turnstile thành công!")
if __name__ == "__main__":
main()
Ví dụ này tự động phát hiện khóa trang từ trang - không cần cấu hình thủ công:
import time
import requests
from DrissionPage import ChromiumPage, ChromiumOptions
CAPSOLVER_API_KEY = "KHÓA_API_CỦA_BẠN"
CAPSOLVER_API = "https://api.capsolver.com"
def solve_recaptcha_v2(site_key: str, page_url: str) -> str:
"""Giải quyết reCAPTCHA v2 và trả về token."""
# Tạo nhiệm vụ
response = requests.post(
f"{CAPSOLVER_API}/createTask",
json={
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "ReCaptchaV2TaskProxyLess",
"websiteURL": page_url,
"websiteKey": site_key,
}
}
)
result = response.json()
if result.get("errorId") != 0:
raise Exception(f"Lỗi: {result.get('errorDescription')}")
task_id = result["taskId"]
print(f"Nhật ký được tạo: {task_id}")
# Lắng nghe kết quả
while True:
result = requests.post(
f"{CAPSOLVER_API}/getTaskResult",
json={
"clientKey": CAPSOLVER_API_KEY,
"taskId": task_id
}
).json()
if result.get("status") == "ready":
return result["solution"]["gRecaptchaResponse"]
elif result.get("status") == "failed":
raise Exception(f"Thất bại: {result.get('errorDescription')}")
time.sleep(1)
def main():
# Chỉ cần cung cấp URL - khóa trang sẽ được phát hiện tự động
target_url = "https://www.google.com/recaptcha/api2/demo"
# Cấu hình trình duyệt
co = ChromiumOptions()
co.set_argument('--disable-blink-features=AutomationControlled')
print("Bắt đầu trình duyệt...")
page = ChromiumPage(co)
try:
page.get(target_url)
time.sleep(2)
# Phát hiện khóa trang từ trang
recaptcha_div = page('.g-recaptcha')
if not recaptcha_div:
print("Không tìm thấy reCAPTCHA trên trang!")
return
site_key = recaptcha_div.attr('data-sitekey')
print(f"Khóa trang được phát hiện tự động: {site_key}")
# Giải quyết CAPTCHA
print("Giải quyết reCAPTCHA v2...")
token = solve_recaptcha_v2(site_key, target_url)
print(f"Nhận được token: {token[:50]}...")
# Chèn token
page.run_js(f'''
var responseField = document.getElementById('g-recaptcha-response');
responseField.style.display = 'block';
responseField.value = '{token}';
''')
print("Token đã được chèn!")
# Gửi biểu mẫu
submit_btn = page('#recaptcha-demo-submit') or page('input[type="submit"]') or page('button[type="submit"]')
if submit_btn:
submit_btn.click()
time.sleep(3)
print("Biểu mẫu đã được gửi!")
print(f"URL hiện tại: {page.url}")
print("THÀNH CÔNG!")
finally:
page.quit()
if __name__ == "__main__":
main()
Thử nghiệm bản thân bạn:
python recaptcha_demo.py
Điều này sẽ mở trang demo reCAPTCHA của Google, tự động phát hiện khóa trang, giải quyết CAPTCHA và gửi biểu mẫu.
reCAPTCHA v3 dựa trên điểm số và không yêu cầu tương tác người dùng. Bạn cần chỉ định tham số hành động.
import time
import requests
from DrissionPage import ChromiumPage, ChromiumOptions
CAPSOLVER_API_KEY = "KHÓA_API_CỦA_BẠN"
CAPSOLVER_API = "https://api.capsolver.com"
def solve_recaptcha_v3(
site_key: str,
page_url: str,
action: str = "verify",
min_score: float = 0.7
) -> str:
"""Giải quyết reCAPTCHA v3 với hành động và điểm số tối thiểu được chỉ định."""
response = requests.post(
f"{CAPSOLVER_API}/createTask",
json={
"clientKey": CAPSOLVER_API_KEY,
"task": {
"type": "ReCaptchaV3TaskProxyLess",
"websiteURL": page_url,
"websiteKey": site_key,
"pageAction": action,
"minScore": min_score
}
}
)
result = response.json()
if result.get("errorId") != 0:
raise Exception(f"Lỗi: {result.get('errorDescription')}")
task_id = result["taskId"]
while True:
result = requests.post(
f"{CAPSOLVER_API}/getTaskResult",
json={
"clientKey": CAPSOLVER_API_KEY,
"taskId": task_id
}
).json()
if result.get("status") == "ready":
return result["solution"]["gRecaptchaResponse"]
elif result.get("status") == "failed":
raise Exception(f"Thất bại: {result.get('errorDescription')}")
time.sleep(1)
def main():
target_url = "https://trang-mục-tiêu-của-bạn.com"
recaptcha_v3_key = "6LcXXXXXXXXXXXXXXXXXXXXXXXXX"
# Thiết lập trình duyệt không đầu
co = ChromiumOptions()
co.headless()
page = ChromiumPage(co)
page.get(target_url)
# Giải quyết reCAPTCHA v3 với hành động "search"
print("Giải quyết reCAPTCHA v3...")
token = solve_recaptcha_v3(
recaptcha_v3_key,
target_url,
action="search",
min_score=0.9 # Yêu cầu điểm số cao
)
# Thực thi callback với token
page.run_js(f'''
// Nếu có hàm callback, gọi nó với token
if (typeof onRecaptchaSuccess === 'function') {{
onRecaptchaSuccess('{token}');
}}
''')
print("Callback đã được thực thi!")
print(f"URL hiện tại: {page.url}")
print("THÀNH CÔNG!")
if __name__ == "__main__":
main()
}}
// Hoặc thiết lập giá trị trường ẩn
var responseField = document.querySelector('[name="g-recaptcha-response"]');
if (responseField) {{
responseField.value = '{token}';
}}
''')
print("Đã vượt qua reCAPTCHA v3!")
if name == "main":
main()
### 6.4. Sử dụng Action Chains để mô phỏng hành vi người dùng
DrissionPage cung cấp các chuỗi hành động để mô phỏng các thao tác chuột và bàn phím tự nhiên:
```python
import time
import random
from DrissionPage import ChromiumPage
from DrissionPage.common import Keys, Actions
def human_delay():
"""Độ trễ ngẫu nhiên để mô phỏng hành vi người dùng."""
time.sleep(random.uniform(0.5, 1.5))
def main():
page = ChromiumPage()
page.get('https://your-target-site.com/form')
# Sử dụng chuỗi hành động để tương tác tự nhiên
ac = Actions(page)
# Di chuyển đến ô nhập liệu một cách tự nhiên, sau đó nhấp và nhập
ac.move_to('input[name="email"]').click()
human_delay()
# Nhập từng ký tự một cách chậm rãi như người dùng
for char in "user@email.com":
ac.type(char)
time.sleep(random.uniform(0.05, 0.15))
human_delay()
# Di chuyển đến ô mật khẩu
ac.move_to('input[name="password"]').click()
human_delay()
# Nhập mật khẩu
page('input[name="password"]').input("mypassword123")
# Sau khi giải CAPTCHA, nhấp vào nút gửi với chuyển động tự nhiên
ac.move_to('button[type="submit"]')
human_delay()
ac.click()
if __name__ == "__main__":
main()
Cấu hình DrissionPage để trông giống trình duyệt bình thường hơn:
from DrissionPage import ChromiumPage, ChromiumOptions
co = ChromiumOptions()
co.set_argument('--disable-blink-features=AutomationControlled')
co.set_argument('--no-sandbox')
co.set_user_agent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36')
# Đặt kích thước cửa sổ thành độ phân giải phổ biến
co.set_argument('--window-size=1920,1080')
page = ChromiumPage(co)
from DrissionPage import ChromiumPage, ChromiumOptions
co = ChromiumOptions()
co.incognito() # Sử dụng chế độ ẩn danh
co.headless() # Chạy ở chế độ headless (đối với CAPTCHA v3)
page = ChromiumPage(co)
Tránh kích hoạt giới hạn tốc độ bằng cách thêm độ trễ ngẫu nhiên:
import random
import time
def human_delay(min_sec=1.0, max_sec=3.0):
"""Độ trễ ngẫu nhiên để mô phỏng hành vi người dùng."""
time.sleep(random.uniform(min_sec, max_sec))
# Sử dụng giữa các hành động
page('#button1').click()
human_delay()
page('#input1').input('text')
Luôn triển khai xử lý lỗi phù hợp cho việc giải CAPTCHA:
def solve_with_retry(task_payload: dict, max_retries: int = 3) -> dict:
"""Giải CAPTCHA với logic thử lại."""
for attempt in range(max_retries):
try:
return solve_captcha(task_payload)
except TimeoutError:
if attempt < max_retries - 1:
print(f"Timeout, đang thử lại... ({attempt + 1}/{max_retries})")
time.sleep(5)
else:
raise
except Exception as e:
if "balance" in str(e).lower():
raise # Không thử lại nếu lỗi số dư
if attempt < max_retries - 1:
time.sleep(2)
else:
raise
Sử dụng proxy với DrissionPage để xoay IP:
from DrissionPage import ChromiumPage, ChromiumOptions
co = ChromiumOptions()
co.set_proxy('http://username:password@proxy.example.com:8080')
page = ChromiumPage(co)
Việc tích hợp DrissionPage và CapSolver tạo ra một công cụ mạnh mẽ cho tự động hóa web:
Dù bạn đang xây dựng trình thu thập dữ liệu, hệ thống kiểm thử tự động hay các pipeline thu thập dữ liệu, sự kết hợp này mang lại độ tin cậy và tính tinh vi mà bạn cần.
Lời khuyên: Sử dụng mã
DRISSIONkhi đăng ký tại CapSolver để nhận được tín dụng bổ sung!
DrissionPage không sử dụng WebDriver, điều này có nghĩa là:
CapSolver hỗ trợ tất cả các loại CAPTCHA chính. Cloudflare Turnstile và reCAPTCHA v2/v3 có tỷ lệ thành công cao nhất. Sự tích hợp hoạt động một cách trơn tru với bất kỳ CAPTCHA nào mà CapSolver hỗ trợ.
Có! DrissionPage hỗ trợ chế độ headless. Ở chế độ headless, nó hoạt động hoàn hảo với reCAPTCHA v3 và các CAPTCHA dựa trên token. Đối với CAPTCHA v2 hiển thị, chế độ có giao diện (headed mode) có thể mang lại kết quả tốt hơn.
Tìm trong mã nguồn trang web:
data-sitekey hoặc các phần tử cf-turnstiledata-sitekey trên phần tử g-recaptchaCác giải pháp phổ biến:
Có! DrissionPage có hỗ trợ tích hợp các phần tử trong shadow DOM thông qua lớp ChromiumShadowElement.
Học kiến trúc gỡ mã web Rust có thể mở rộng với reqwest, scraper, gỡ mã bất đồng bộ, gỡ mã trình duyệt không đầu, xoay proxy và xử lý CAPTCHA tuân thủ.

Tự động hóa việc giải CAPTCHA với Nanobot và CapSolver. Sử dụng Playwright để giải reCAPTCHA và Cloudflare tự động.
